package com.design.singleton;

public class SingletonLazy {
	
	private static SingletonLazy singleton;
	
	private SingletonLazy() {};
	
	/**
	 * 简单懒汉模式单例
	 * 安全可靠性：低
	 * 这种方式的懒汉模式只能在单线程下执行，如果在多线程环境下，可能会出现线程A在进行if判断时未来得及产生实例，线程B就完成了判断进入产生实例，这样就会产生多个实例，单例创建失败
	 * @return
	 */
/*	public static SingletonLazy getSingletonLazy() {
		
		if(null == singleton) {
			
			singleton = new SingletonLazy();
			
		}
		
		return singleton;
	}*/
	
	
	
	/**
	 * 简单懒汉模式单例  + 函数同步
	 * 安全可靠性：高     效率：低   
	 * 这种方式的懒汉模式在多线程下可实现单例，但效率低下，每个线程进来后都要排队等待getSingletonLazy函数，实例创建后，这里的同步就没有意义了，会拖垮性能
	 * @return
	 */
/*	public static synchronized SingletonLazy getSingletonLazy() {
		
		if(null == singleton) {
			
			singleton = new SingletonLazy();
			
		}
		
		return singleton;
	}*/
	
	
	/**
	 * 简单懒汉模式单例  + 函数同步
	 * 安全可靠性：高     效率：低   
	 * 这种方式的懒汉模式在多线程下可实现单例，但因为synchronized块写在检查里面，如果线程A在同步代码块中生成对象时，线程B也刚好通过了if检查，那边同步块轮到线程B掌控时，线程B也会去新建一个对象
	 * @return
	 */
/*	public static SingletonLazy getSingletonLazy() {
		
		if(null == singleton) {
			
			synchronized (SingletonLazy.class) {
				
				singleton = new SingletonLazy();
			}
			
		}
		
		return singleton;
	}*/
	
	
	/**
	 * 简单懒汉模式单例  + 函数同步
	 * 安全可靠性：高     效率：低   
	 * 这种方式的懒汉模式在多线程下可实现单例，并使用了双重检查锁定，不会出现创建多个对象
	 * @return
	 */
	public static SingletonLazy getSingletonLazy() {
		
		if(null == singleton) {
			
			synchronized (SingletonLazy.class) {
				
				if(null == singleton) {
					
					singleton = new SingletonLazy();
					
				}
				
				
			}
			
		}
		
		return singleton;
	}


}
